;; Examples of equivalence predicates: eq?, eqv?, and equal?

;; eq? tests for object identity
(eq? #t #t)           ; #t - same boolean object
(eq? #t #f)           ; #f - different boolean objects
(eq? 'a 'a)           ; #t - same symbol
(eq? "hello" "hello") ; #f - different string objects in memory
(eq? 1 1)             ; #f - different number objects in memory
(eq? '() '())         ; #t - same null object

;; eqv? tests for value equality for simple types
(eqv? #t #t)           ; #t - same boolean value
(eqv? #t #f)           ; #f - different boolean values
(eqv? 1 1)             ; #t - same number value
(eqv? 1/2 2/4)         ; #t - same rational value (simplified)
(eqv? #\a #\a)         ; #t - same character
(eqv? "hello" "hello") ; #t - same string value
(eqv? '() '())         ; #t - same null object

;; equal? tests for structural equality
(equal? #t #t)                    ; #t - same boolean value
(equal? #t #f)                    ; #f - different boolean values
(equal? 1 1)                      ; #t - same number value
(equal? 1/2 2/4)                  ; #t - same rational value (simplified)
(equal? #\a #\a)                  ; #t - same character
(equal? "hello" "hello")          ; #t - same string value
(equal? '(1 2 3) '(1 2 3))        ; #t - same list structure
(equal? '((1 2) (3 4)) '((1 2) (3 4))) ; #t - same nested list structure